{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import os\n",
    "from dotenv import load_dotenv\n",
    "# Load environment variables from openai.env file\n",
    "load_dotenv(\"openai.env\")\n",
    "\n",
    "# Read the OPENAI_API_KEY from the environment\n",
    "api_key = os.getenv(\"OPENAI_API_KEY\")\n",
    "api_base = os.getenv(\"OPENAI_API_BASE\")\n",
    "os.environ[\"OPENAI_API_KEY\"] = api_key\n",
    "os.environ[\"OPENAI_API_BASE\"] = api_base"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 使用LLMChain克隆一个ChatGPT\n",
    "\n",
    "- 自定义提示词\n",
    "- 使用记忆\n",
    "\n",
    "<hr>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tomiezhang/.pyenv/versions/3.10.12/envs/langchains/lib/python3.11/site-packages/langchain_core/_api/deprecation.py:117: LangChainDeprecationWarning: The class `langchain_community.llms.openai.OpenAI` was deprecated in langchain-community 0.0.10 and will be removed in 0.2.0. An updated version of the class exists in the langchain-openai package and should be used instead. To use it run `pip install -U langchain-openai` and import as `from langchain_openai import OpenAI`.\n",
      "  warn_deprecated(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mAI助手是由OpenAI训练的大型语言模型。\n",
      "\n",
      "AI助手旨在能够处理各种任务，从回答简单问题到提供广泛话题的深入解释和讨论。作为一个语言模型，AI助手能够根据接收到的输入生成类似人类的文本，使其能够进行自然的对话并提供与当前话题相关且连贯的回答。\n",
      "\n",
      "AI助手不断学习和改进，其能力不断发展。它能够处理和理解大量文本，并利用这些知识对各种问题提供准确和丰富的回答。此外，AI助手能够根据接收到的输入生成自己的文本，使其能够参与讨论并就各种话题提供解释和描述。\n",
      "\n",
      "总的来说，AI助手是一个强大的工具，可以帮助处理各种任务，并就广泛话题提供有价值的见解和信息。无论您需要针对特定问题的帮助，还是只是想就某个特定话题进行交流，AI助手都在这里为您提供帮助。\n",
      "\n",
      "\n",
      "Human: 我要求你扮演Linux终端。我会输入命令，你将回复终端应显示的内容。我希望你只在一个唯一的代码块内回复终端输出，不添加其他内容。除非我指示你这样做，否则请不要输入命令。当我需要用英文告诉你一些信息时，我会用花括号{像这样}。我的第一个命令是pwd\n",
      "AI助手:\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      " 终端应显示当前工作目录的路径。\n"
     ]
    }
   ],
   "source": [
    "from langchain.chains import LLMChain\n",
    "from langchain.llms import OpenAI\n",
    "from langchain.memory import ConversationBufferWindowMemory\n",
    "from langchain.prompts import PromptTemplate\n",
    "\n",
    "template = \"\"\"AI助手是由OpenAI训练的大型语言模型。\n",
    "\n",
    "AI助手旨在能够处理各种任务，从回答简单问题到提供广泛话题的深入解释和讨论。作为一个语言模型，AI助手能够根据接收到的输入生成类似人类的文本，使其能够进行自然的对话并提供与当前话题相关且连贯的回答。\n",
    "\n",
    "AI助手不断学习和改进，其能力不断发展。它能够处理和理解大量文本，并利用这些知识对各种问题提供准确和丰富的回答。此外，AI助手能够根据接收到的输入生成自己的文本，使其能够参与讨论并就各种话题提供解释和描述。\n",
    "\n",
    "总的来说，AI助手是一个强大的工具，可以帮助处理各种任务，并就广泛话题提供有价值的见解和信息。无论您需要针对特定问题的帮助，还是只是想就某个特定话题进行交流，AI助手都在这里为您提供帮助。\n",
    "\n",
    "{history}\n",
    "Human: {human_input}\n",
    "AI助手:\"\"\"\n",
    "\n",
    "prompt = PromptTemplate(input_variables=[\"history\", \"human_input\"], template=template)\n",
    "\n",
    "\n",
    "chatgpt_chain = LLMChain(\n",
    "    llm=OpenAI(temperature=0),\n",
    "    prompt=prompt,\n",
    "    verbose=True,\n",
    "    memory=ConversationBufferWindowMemory(k=2),\n",
    ")\n",
    "\n",
    "output = chatgpt_chain.predict(\n",
    "    human_input=\"我要求你扮演Linux终端。我会输入命令，你将回复终端应显示的内容。我希望你只在一个唯一的代码块内回复终端输出，不添加其他内容。除非我指示你这样做，否则请不要输入命令。当我需要用英文告诉你一些信息时，我会用花括号{像这样}。我的第一个命令是pwd\"\n",
    "\n",
    ")\n",
    "print(output)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mAI助手是由OpenAI训练的大型语言模型。\n",
      "\n",
      "AI助手旨在能够处理各种任务，从回答简单问题到提供广泛话题的深入解释和讨论。作为一个语言模型，AI助手能够根据接收到的输入生成类似人类的文本，使其能够进行自然的对话并提供与当前话题相关且连贯的回答。\n",
      "\n",
      "AI助手不断学习和改进，其能力不断发展。它能够处理和理解大量文本，并利用这些知识对各种问题提供准确和丰富的回答。此外，AI助手能够根据接收到的输入生成自己的文本，使其能够参与讨论并就各种话题提供解释和描述。\n",
      "\n",
      "总的来说，AI助手是一个强大的工具，可以帮助处理各种任务，并就广泛话题提供有价值的见解和信息。无论您需要针对特定问题的帮助，还是只是想就某个特定话题进行交流，AI助手都在这里为您提供帮助。\n",
      "\n",
      "Human: 我要求你扮演Linux终端。我会输入命令，你将回复终端应显示的内容。我希望你只在一个唯一的代码块内回复终端输出，不添加其他内容。除非我指示你这样做，否则请不要输入命令。当我需要用英文告诉你一些信息时，我会用花括号{像这样}。我的第一个命令是pwd\n",
      "AI:  终端应显示当前工作目录的路径。\n",
      "Human: ls ~\n",
      "AI助手:\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      " 终端应显示当前用户的主目录中的所有文件和文件夹。\n"
     ]
    }
   ],
   "source": [
    "output = chatgpt_chain.predict(human_input=\"ls ~\")\n",
    "print(output)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mAI助手是由OpenAI训练的大型语言模型。\n",
      "\n",
      "AI助手旨在能够处理各种任务，从回答简单问题到提供广泛话题的深入解释和讨论。作为一个语言模型，AI助手能够根据接收到的输入生成类似人类的文本，使其能够进行自然的对话并提供与当前话题相关且连贯的回答。\n",
      "\n",
      "AI助手不断学习和改进，其能力不断发展。它能够处理和理解大量文本，并利用这些知识对各种问题提供准确和丰富的回答。此外，AI助手能够根据接收到的输入生成自己的文本，使其能够参与讨论并就各种话题提供解释和描述。\n",
      "\n",
      "总的来说，AI助手是一个强大的工具，可以帮助处理各种任务，并就广泛话题提供有价值的见解和信息。无论您需要针对特定问题的帮助，还是只是想就某个特定话题进行交流，AI助手都在这里为您提供帮助。\n",
      "\n",
      "Human: 我要求你扮演Linux终端。我会输入命令，你将回复终端应显示的内容。我希望你只在一个唯一的代码块内回复终端输出，不添加其他内容。除非我指示你这样做，否则请不要输入命令。当我需要用英文告诉你一些信息时，我会用花括号{像这样}。我的第一个命令是pwd\n",
      "AI:  终端应显示当前工作目录的路径。\n",
      "Human: ls ~\n",
      "AI:  终端应显示当前用户的主目录中的所有文件和文件夹。\n",
      "Human: cd ~\n",
      "AI助手:\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      " 终端应将当前工作目录更改为当前用户的主目录。\n"
     ]
    }
   ],
   "source": [
    "output = chatgpt_chain.predict(human_input=\"cd ~\")\n",
    "print(output)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mAI助手是由OpenAI训练的大型语言模型。\n",
      "\n",
      "AI助手旨在能够处理各种任务，从回答简单问题到提供广泛话题的深入解释和讨论。作为一个语言模型，AI助手能够根据接收到的输入生成类似人类的文本，使其能够进行自然的对话并提供与当前话题相关且连贯的回答。\n",
      "\n",
      "AI助手不断学习和改进，其能力不断发展。它能够处理和理解大量文本，并利用这些知识对各种问题提供准确和丰富的回答。此外，AI助手能够根据接收到的输入生成自己的文本，使其能够参与讨论并就各种话题提供解释和描述。\n",
      "\n",
      "总的来说，AI助手是一个强大的工具，可以帮助处理各种任务，并就广泛话题提供有价值的见解和信息。无论您需要针对特定问题的帮助，还是只是想就某个特定话题进行交流，AI助手都在这里为您提供帮助。\n",
      "\n",
      "Human: ls ~\n",
      "AI:  终端应显示当前用户的主目录中的所有文件和文件夹。\n",
      "Human: cd ~\n",
      "AI:  终端应将当前工作目录更改为当前用户的主目录。\n",
      "Human: {创建一个名为croypt.txt的文件，并在其中放入主流的加密货币代码}\n",
      "AI助手:\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      " 已创建名为croypt.txt的文件，并在其中放入主流的加密货币代码。\n"
     ]
    }
   ],
   "source": [
    "output = chatgpt_chain.predict(\n",
    "    human_input=\"{创建一个名为croypt.txt的文件，并在其中放入主流的加密货币代码}\"\n",
    ")\n",
    "print(output)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mAI助手是由OpenAI训练的大型语言模型。\n",
      "\n",
      "AI助手旨在能够处理各种任务，从回答简单问题到提供广泛话题的深入解释和讨论。作为一个语言模型，AI助手能够根据接收到的输入生成类似人类的文本，使其能够进行自然的对话并提供与当前话题相关且连贯的回答。\n",
      "\n",
      "AI助手不断学习和改进，其能力不断发展。它能够处理和理解大量文本，并利用这些知识对各种问题提供准确和丰富的回答。此外，AI助手能够根据接收到的输入生成自己的文本，使其能够参与讨论并就各种话题提供解释和描述。\n",
      "\n",
      "总的来说，AI助手是一个强大的工具，可以帮助处理各种任务，并就广泛话题提供有价值的见解和信息。无论您需要针对特定问题的帮助，还是只是想就某个特定话题进行交流，AI助手都在这里为您提供帮助。\n",
      "\n",
      "Human: cd ~\n",
      "AI:  终端应将当前工作目录更改为当前用户的主目录。\n",
      "Human: {创建一个名为croypt.txt的文件，并在其中放入主流的加密货币代码}\n",
      "AI:  已创建名为croypt.txt的文件，并在其中放入主流的加密货币代码。\n",
      "Human: echo -e \"x=lambda y:y*5+3;print('Result:' + str(x(6)))\" > run.py && python3 run.py\n",
      "AI助手:\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      " 已创建名为run.py的文件，并在其中放入代码。运行后，将输出结果为33。\n"
     ]
    }
   ],
   "source": [
    "output = chatgpt_chain.predict(\n",
    "    human_input=\"\"\"echo -e \"x=lambda y:y*5+3;print('Result:' + str(x(6)))\" > run.py && python3 run.py\"\"\"\n",
    ")\n",
    "print(output)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mAI助手是由OpenAI训练的大型语言模型。\n",
      "\n",
      "AI助手旨在能够处理各种任务，从回答简单问题到提供广泛话题的深入解释和讨论。作为一个语言模型，AI助手能够根据接收到的输入生成类似人类的文本，使其能够进行自然的对话并提供与当前话题相关且连贯的回答。\n",
      "\n",
      "AI助手不断学习和改进，其能力不断发展。它能够处理和理解大量文本，并利用这些知识对各种问题提供准确和丰富的回答。此外，AI助手能够根据接收到的输入生成自己的文本，使其能够参与讨论并就各种话题提供解释和描述。\n",
      "\n",
      "总的来说，AI助手是一个强大的工具，可以帮助处理各种任务，并就广泛话题提供有价值的见解和信息。无论您需要针对特定问题的帮助，还是只是想就某个特定话题进行交流，AI助手都在这里为您提供帮助。\n",
      "\n",
      "Human: {创建一个名为croypt.txt的文件，并在其中放入主流的加密货币代码}\n",
      "AI:  已创建名为croypt.txt的文件，并在其中放入主流的加密货币代码。\n",
      "Human: echo -e \"x=lambda y:y*5+3;print('Result:' + str(x(6)))\" > run.py && python3 run.py\n",
      "AI:  已创建名为run.py的文件，并在其中放入代码。运行后，将输出结果为33。\n",
      "Human: echo -e \"print(list(filter(lambda x: all(x%d for d in range(2,x)),range(2,3**10)))[:10])\" > run.py && python3 run.py\n",
      "AI助手:\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      " 已创建名为run.py的文件，并在其中放入代码。运行后，将输出前10个质数。\n"
     ]
    }
   ],
   "source": [
    "output = chatgpt_chain.predict(\n",
    "    human_input=\"\"\"echo -e \"print(list(filter(lambda x: all(x%d for d in range(2,x)),range(2,3**10)))[:10])\" > run.py && python3 run.py\"\"\"\n",
    ")\n",
    "print(output)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3mAI助手是由OpenAI训练的大型语言模型。\n",
      "\n",
      "AI助手旨在能够处理各种任务，从回答简单问题到提供广泛话题的深入解释和讨论。作为一个语言模型，AI助手能够根据接收到的输入生成类似人类的文本，使其能够进行自然的对话并提供与当前话题相关且连贯的回答。\n",
      "\n",
      "AI助手不断学习和改进，其能力不断发展。它能够处理和理解大量文本，并利用这些知识对各种问题提供准确和丰富的回答。此外，AI助手能够根据接收到的输入生成自己的文本，使其能够参与讨论并就各种话题提供解释和描述。\n",
      "\n",
      "总的来说，AI助手是一个强大的工具，可以帮助处理各种任务，并就广泛话题提供有价值的见解和信息。无论您需要针对特定问题的帮助，还是只是想就某个特定话题进行交流，AI助手都在这里为您提供帮助。\n",
      "\n",
      "Human: echo -e \"x=lambda y:y*5+3;print('Result:' + str(x(6)))\" > run.py && python3 run.py\n",
      "AI:  已创建名为run.py的文件，并在其中放入代码。运行后，将输出结果为33。\n",
      "Human: echo -e \"print(list(filter(lambda x: all(x%d for d in range(2,x)),range(2,3**10)))[:10])\" > run.py && python3 run.py\n",
      "AI:  已创建名为run.py的文件，并在其中放入代码。运行后，将输出前10个质数。\n",
      "Human: curl https://chat.openai.com/chat\n",
      "AI助手:\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      " 您可以通过访问chat.openai.com/chat来与我进行对话。我期待与您交流！\n"
     ]
    }
   ],
   "source": [
    "output = chatgpt_chain.predict(human_input=\"curl https://chat.openai.com/chat\")\n",
    "print(output)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "langchains",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
           